package com.dhcc.android.base.utils.zip;

import android.app.Activity;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

/**
 * 压缩 解压缩
 * 
 * @author zhoudan
 * @date 2015年6月8日
 */
public class ZipUtil {

    private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte 
    
    /**
     * 解压zip文件
     * 
     * @param zipFile 压缩文件
     * @param descDir 解压路径 【最后不要 '/'】
     */
    public static void unZipFiles(Activity activty,String zipFilePath,String descDir){ 
        System.out.println("###进入解压方法");
        File pathFile = new File(descDir);  
        if(!pathFile.exists()){  
            System.out.println("###创建解压路径");
            pathFile.mkdirs();  
        }  
        System.out.println("###压缩文件："+zipFilePath);
        System.out.println("###解压路径："+descDir);
        try{
            ZipFile zip = new ZipFile(new File(zipFilePath),"GBK"); 
            for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){
                System.out.println("###进入循环里面");
                ZipEntry entry = (ZipEntry)entries.nextElement();  
                String zipEntryName = entry.getName();  
                InputStream in = zip.getInputStream(entry);  
                System.out.println("###1--:"+descDir+"/"+zipEntryName);
                String outPath = (descDir+"/"+zipEntryName).replaceAll("\\*", "/");  
                //判断路径是否存在,不存在则创建文件路径  
                File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));  
                if(!file.exists()){  
                    file.mkdirs();  
                }  
                //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压  
                if(new File(outPath).isDirectory()){  
                    continue;  
                }  
                //输出文件路径信息  
                System.out.println(outPath);  
                  
                OutputStream out = new FileOutputStream(outPath);  
                byte[] buf1 = new byte[1024];  
                int len;  
                while((len=in.read(buf1))>0){  
                    out.write(buf1,0,len);  
                }  
                in.close();  
                out.close();  
            }  
        }catch(Exception e){
            e.printStackTrace();
        }finally{
        }
        
        System.out.println("***************zip***解压完毕********************");  
    }  
    
    /**
     * 解压rar文件
     * @param srcRarPath 压缩文件路径
     * @param dstDirectoryPath 解压路径 【最后不要 '/'】
     */
    public static void unRarFile(String srcRarPath, String dstDirectoryPath){
        if (!srcRarPath.toLowerCase().endsWith(".rar")) {
            System.out.println("非rar文件！");
            return;
        }
        
        File dstDiretory = new File(dstDirectoryPath);
        if (!dstDiretory.exists()) {// 目标目录不存在时，创建该文件夹
            dstDiretory.mkdirs();
        }
        
        Archive a = null;
        try {
            a = new Archive(new File(srcRarPath));
            if (a != null) {
                a.getMainHeader().print(); // 打印文件信息.
                FileHeader fh = a.nextFileHeader();
                while (fh != null) {
                    if (fh.isDirectory()) { // 文件夹 
                        File fol = new File(dstDirectoryPath + File.separator
                                + fh.getFileNameString());
                        fol.mkdirs();
                    } else { // 文件
                        File out = new File(dstDirectoryPath + File.separator
                                + fh.getFileNameString().trim());
                        //System.out.println(out.getAbsolutePath());
                        try {// 之所以这么写try，是因为万一这里面有了异常，不影响继续解压. 
                            if (!out.exists()) {
                                if (!out.getParentFile().exists()) {// 相对路径可能多级，可能需要创建父目录. 
                                    out.getParentFile().mkdirs();
                                }
                                out.createNewFile();
                            }
                            FileOutputStream os = new FileOutputStream(out);
                            a.extractFile(fh, os);
                            os.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                    fh = a.nextFileHeader();
                }
                
                System.out.println("--------------rar--解压完成----------------");
                a.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * zip压缩
     * 
     * @param path 需要被压缩的文件/文件夹
     * @param finalFile 压缩文件路径+名称+‘.zip’
     */
    public static void zip(String srcPathName,String finalFile){
        File srcdir = new File(srcPathName);    
        if (!srcdir.exists()){  
            throw new RuntimeException(srcPathName + "不存在！");    
        }   
        File zipFile = new File(finalFile);
        
        Project prj = new Project();    
        Zip zip = new Zip();    
        zip.setProject(prj);    
        zip.setDestFile(zipFile);    
        FileSet fileSet = new FileSet();    
        fileSet.setProject(prj);    
        fileSet.setDir(srcdir);    
        //fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹 eg:zip.setIncludes("*.java");    
        //fileSet.setExcludes(...); //排除哪些文件或文件夹    
        zip.addFileset(fileSet);    
        zip.execute();    
    }
}
